1.前言
这篇文章是基于k-means算法进行图片聚类,而不是对单个图片的像素聚类,分别基于RGB、HSV和HOG特征进行聚类分析。
2.图片特征提取——RGB
RGB为图片最基本的特征,但很多时候RGB颜色空间并不能很好的作为图片聚类的聚簇依据,通常不符合人们对颜色相似性的主观判断,我尝试了用RGB进行聚类,但是效果并没有其他两种好。
其实现代码如下:
def get_rgb_hist_feature(image_name):
hist_feature = []
img = cv2.imread(image_name)
color = ('b', 'g', 'r')
for index, value in enumerate(color):
hist = cv2.calcHist([img], [index], None, [256], [0, 256])
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)
hist_feature.append(hist)
return list(np.array(hist_feature).ravel())
分别提取RGB颜色空间,最终返回列表。
3.图片特征提取——HSV
hsv能够简单的描述一张图片颜色的全局分布,适用于那些难以自动分割、不需要考虑物体空间位置的图像。hsv的三个分量分别为:色彩(Hue)、饱和度(Saturation)、值(Value)。
其代码实现如下:
def get_hsv_hist_feature(image_name):
hist_feature = []
img = cv2.imread(image_name)
img = cv2.resize(img, (256, 256))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hist_h = cv2.calcHist([hsv], [0], None, [180], [0, 180])
hist_h = cv2.normalize(hist_h, hist_h)
hist_feature[0:180] = hist_h[:,0]
hist_s = cv2.calcHist([hsv], [1], None, [256], [0, 256])
hist_s = cv2.normalize(hist_s, hist_s)
hist_feature[180:436] = hist_s[:,0]
hist_v = cv2.calcHist([hsv], [2], None, [256], [0, 256])
hist_v = cv2.normalize(hist_v,hist_v)
hist_feature[436:692] = hist_v[:,0]
return list(np.array(hist_feature).ravel())
在hsv特征中,每个分量都有自己的取值范围,在提取特征时需要注意列表长度。
4.图片特征提取——HOG特征
HOG特征检测算法实现的几个步骤:颜色空间归一化、梯度计算、梯度方向直方图、重叠块直方图归一化、HOG特征。
其实现代码如下:
def get_hog_feature(image_name):
img = cv2.imread(image_name)
img = cv2.resize(img, (256, 256))
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hog_feature = feature.hog(gray_image, orientations=8, pixels_per_cell=(16, 16),
cells_per_block=(1, 1))
return list(hog_feature.ravel())